﻿#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
#include "logo.h"

// 定义串口设备路径和波特率宏，方便修改
#define SERIAL_PORT "/dev/ttyACM0"
#define BAUDRATE    B115200

int main() {
    int fd;
    ssize_t bytes_written;
    size_t total_bytes = gImage_logo_size;  // 使用定义好的大小变量
    
    // 1. 打印总字节数
    printf("Total bytes to send: %zu\n", total_bytes);
    
    // 2. 打开串口设备
    fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_SYNC);
    if (fd < 0) {
        perror("Error opening serial port");
        return 1;
    }
    
    // 3. 配置串口参数 (与单片机配置匹配)
    struct termios options;
    tcgetattr(fd, &options);
    cfsetispeed(&options, BAUDRATE);
    cfsetospeed(&options, BAUDRATE);
    
    options.c_cflag &= ~PARENB;   // 无奇偶校验
    options.c_cflag &= ~CSTOPB;   // 1位停止位
    options.c_cflag &= ~CSIZE;    // 清除数据位掩码
    options.c_cflag |= CS8;       // 8位数据位
    options.c_cflag &= ~CRTSCTS;  // 无硬件流控
    options.c_cflag |= (CLOCAL | CREAD);  // 本地连接，启用接收
    
    options.c_lflag = 0;          // 关闭规范模式
    options.c_oflag = 0;          // 关闭输出处理
    options.c_cc[VTIME] = 10;     // 超时时间 (1秒)
    options.c_cc[VMIN] = 0;       // 最小读取字符数
    
    tcsetattr(fd, TCSANOW, &options);
    tcflush(fd, TCIOFLUSH);  // 清空缓冲区
    
    // 4. 分块发送数据 (每块256字节)
    size_t sent = 0;
    const size_t chunk_size = 256;
    
    while (sent < total_bytes) {
        // 计算本次发送大小
        size_t to_send = (total_bytes - sent > chunk_size) ? 
                         chunk_size : total_bytes - sent;
        
        // 发送数据块
        bytes_written = write(fd, &gImage_logo[sent], to_send);
        if (bytes_written < 0) {
            perror("Write error");
            break;
        }
        
        // 更新已发送计数
        sent += bytes_written;
        printf("Sent %zd/%zu bytes (%.1f%%)\r", 
               sent, total_bytes, (sent * 100.0) / total_bytes);
        fflush(stdout);
        
        // 添加小延迟让串口处理（可选）
        usleep(100000);
    }
    
    printf("\nTransfer completed: %zu bytes sent\n", sent);
    close(fd);
    return 0;
}